From: Matthieu Gallien Date: Fri, 25 Apr 2025 07:47:08 +0000 (+0200) Subject: fix(filesystem): log more permissions when deleting a file fails X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2^2~1^2~4 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=b5a67fe37302e77eb1d5c389a749b40d08b62460;p=nextcloud-desktop.git fix(filesystem): log more permissions when deleting a file fails Signed-off-by: Matthieu Gallien --- diff --git a/src/common/filesystembase.cpp b/src/common/filesystembase.cpp index fafd0eeba..88ace9a91 100644 --- a/src/common/filesystembase.cpp +++ b/src/common/filesystembase.cpp @@ -320,6 +320,11 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi } #ifdef Q_OS_WIN +std::filesystem::perms FileSystem::filePermissionsWinSymlinkSafe(const QString &filename) +{ + return std::filesystem::symlink_status(filename.toStdWString()).permissions(); +} + std::filesystem::perms FileSystem::filePermissionsWin(const QString &filename) { return std::filesystem::status(filename.toStdWString()).permissions(); @@ -551,6 +556,31 @@ bool FileSystem::remove(const QString &fileName, QString *errorString) *errorString = f.errorString(); } qCWarning(lcFileSystem()) << f.errorString() << fileName; + +#if defined Q_OS_WIN + const auto permissionsDisplayHelper = [] (std::filesystem::perms currentPermissions) { + const auto unitaryHelper = [currentPermissions] (std::filesystem::perms testedPermission, char permissionChar) { + return (static_cast(currentPermissions & testedPermission) ? permissionChar : '-'); + }; + + qCInfo(lcFileSystem()) << unitaryHelper(std::filesystem::perms::owner_read, 'r') + << unitaryHelper(std::filesystem::perms::owner_write, 'w') + << unitaryHelper(std::filesystem::perms::owner_exec, 'x') + << unitaryHelper(std::filesystem::perms::group_read, 'r') + << unitaryHelper(std::filesystem::perms::group_write, 'w') + << unitaryHelper(std::filesystem::perms::group_exec, 'x') + << unitaryHelper(std::filesystem::perms::others_read, 'r') + << unitaryHelper(std::filesystem::perms::others_write, 'w') + << unitaryHelper(std::filesystem::perms::others_exec, 'x'); + }; + + const auto unsafeFilePermissions = filePermissionsWin(fileName); + permissionsDisplayHelper(unsafeFilePermissions); + + const auto safeFilePermissions = filePermissionsWinSymlinkSafe(fileName); + permissionsDisplayHelper(safeFilePermissions); +#endif + return false; } return true; diff --git a/src/common/filesystembase.h b/src/common/filesystembase.h index e9547d2d0..481e765f6 100644 --- a/src/common/filesystembase.h +++ b/src/common/filesystembase.h @@ -173,6 +173,7 @@ namespace FileSystem { */ QString OCSYNC_EXPORT pathtoUNC(const QString &str); + std::filesystem::perms OCSYNC_EXPORT filePermissionsWinSymlinkSafe(const QString &filename); std::filesystem::perms OCSYNC_EXPORT filePermissionsWin(const QString &filename); void OCSYNC_EXPORT setFilePermissionsWin(const QString &filename, const std::filesystem::perms &perms); #endif